﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "CollaborationCacheInterface.h"
#include "IObject.h"

namespace gcmp
{
    /// \brief 构件级协同，Element的Owner信息管理
    class COLLABORATION_CACHE_INTERFACE_EXPORT IElementOwnerManager : public IObject
    {
        DEFINE_CAST_DERIVED(IElementOwnerManager, IObject)
    public:
        /// \brief 向缓存中设置Element的Owner信息
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param elementId 需要设置Owner的ElementId
        /// \param ownerId Element的ownerId
        /// \return void
        virtual void Set(const ElementId& elementId, int64_t ownerId) = 0;

        /// \brief 向缓存中批量设置Elements的Owner信息
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param elementsOwner 需要设置版本的ElementIds及对应Owner信息
        /// \return void
        virtual void Set(const std::unordered_map<ElementId, int64_t, ElementIdHash>& elementsOwner) = 0;

        /// \brief 根据ElementId从缓存中删除Owner信息
        ///
        /// \param elementId 需要删除Owner信息的ElementId
        /// \return void
        virtual void Delete(const ElementId& elementId) = 0;

        /// \brief 根据ElementIds从缓存中批量删除Elements的Owner信息
        ///
        /// \param elementIds 需要删除Owener信息的批量ElementId
        /// \return void
        virtual void Delete(const std::vector<ElementId>& elementIds) = 0;

        /// \brief 根据ElementId从缓存中获取Owner信息
        ///
        /// \param elementId 需要获取Owner信息的ElementId
        /// \return int64_t 获取的Owner信息,ElementId不在缓存中，返回 -1
        virtual int64_t Get(const ElementId& elementId) const = 0;

        /// \brief 根据ElementIds从缓存中批量获取Owner信息
        ///
        /// \param elementIds 需要获取Owner信息的批量ElementId
        /// \return std::unordered_map<ElementId, int64_t, ElementIdHash> 批量获取的ElementId及对应Owner信息
        virtual const std::unordered_map<ElementId, int64_t, ElementIdHash> Get(const std::vector<ElementId>& elementIds) const = 0;

        /// \brief 根据对应Owner获取缓存中所有的ElementIds
        ///
        /// \param owner Owner信息
        /// \return std::vector<ElementId>  获取的ElementIds
        virtual const std::vector<ElementId> Get(int64_t ownerId) const = 0;

        /// \brief 获取缓存中所有Element的Owner信息
        ///
        /// \return std::unordered_map<ElementId, int64_t, ElementIdHash> 缓存中所有ElementId及对应的Owner信息
        virtual std::unordered_map<ElementId, int64_t, ElementIdHash>& GetAll() = 0;

        /// \brief 获取缓存中所有Element的Owner信息
        ///
        /// \return std::unordered_map<ElementId, int64_t, ElementIdHash> 缓存中所有Elementid及对应的Owner信息
        virtual const std::unordered_map<ElementId, int64_t, ElementIdHash>& GetAll() const = 0;

        /// \brief 清理缓存中所有Element的Owner信息
        ///
        /// \return void
        virtual void Clear() = 0;

    };
}